<?php

    /************************************************************************
     * CSS and Javascript Combinator 0.5
     * Copyright 2006 by Niels Leenheer
     *
     * Permission is hereby granted, free of charge, to any person obtaining
     * a copy of this software and associated documentation files (the
     * "Software"), to deal in the Software without restriction, including
     * without limitation the rights to use, copy, modify, merge, publish,
     * distribute, sublicense, and/or sell copies of the Software, and to
     * permit persons to whom the Software is furnished to do so, subject to
     * the following conditions:
     *
     * The above copyright notice and this permission notice shall be
     * included in all copies or substantial portions of the Software.
     *
     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
     * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
     * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
     * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     */
	include('clases/csstidy/class.csstidy.php');
	include('clases/jspacker/class.JavaScriptPacker.php');

    $cache = false;
    $cachedir = dirname(__FILE__) . '/cache';
    $cssdir = dirname(__FILE__);
    $jsdir = dirname(__FILE__) . '/js';

    // Determine the directory and type we should use
    switch ($_GET['type']) {
        case 'css':
            $base = realpath($cssdir);
			$css = new csstidy();
			$css->set_cfg('case_properties',1);//propiedades a minusculas
			$css->set_cfg('lowercase_s',false);//selectores a minusculas
			$css->set_cfg('compress_colors',true);//comprimir colores
			$css->set_cfg('compress_font-weight',true);//comprimir tamaño de fuente
			$css->set_cfg('merge_selectors',2);//agrupar selectores
			$css->set_cfg('optimise_shorthands',1);//optimizar shorthands
			$css->set_cfg('remove_bslash',true);//quitar / innecesarios
			$css->set_cfg('preserve_css',false);//dejar todo en el orden en el que está
			$css->set_cfg('sort_selectors',true);//ordenar selectores
			$css->set_cfg('sort_properties',true);//ordenar propiedades
			$css->set_cfg('remove_last_;',true);//quitar ultimo ;
			$css->set_cfg('discard_invalid_properties',true);//eliminar propiedades no válidas
			$css->set_cfg('css_level','CSS2.1');//version CSS
			$css->set_cfg('timestamp',false);//incluir fecha
			$css->load_template('highest_compression');

            break;
        case 'javascript':
            $base = realpath($jsdir);
            break;
        case 'js':
            $base = realpath($jsdir);
            break;
        default:
            header ("HTTP/1.0 503 Not Implemented");
            exit;
    };

    $type = $_GET['type'];
    $elements = explode(',', $_GET['files']);
    // Determine last modification date of the files
    $lastmodified = 0;
	foreach($elements as $element){
        $path = realpath($base . '/' . $element);
        if (($type == 'javascript' && substr($path, -3) != '.js') ||  ($type == 'css' && substr($path, -4) != '.css') || ($type == 'js' && substr($path, -3) != '.js')){
            header ("HTTP/1.0 403 Forbidden");
            exit;
        }

        if (substr($path, 0, strlen($base)) != $base || !file_exists($path)) {
            header ("HTTP/1.0 404 Not Found");
            exit;
        }

        $lastmodified = max($lastmodified, filemtime($path));
    }

    // Send Etag hash
    $hash = $lastmodified . '-' . md5($_GET['files']);
    header ("Etag: \"" . $hash . "\"");

    // Determine supported compression method
    $gzip = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip');
    $deflate = strstr($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate');
    // Determine used compression method
    $encoding = $gzip ? 'gzip' : ($deflate ? 'deflate' : 'none');
    // Check for buggy versions of Internet Explorer
    if (!strstr($_SERVER['HTTP_USER_AGENT'], 'Opera') &&                 preg_match('/^Mozilla\/4\.0 \(compatible; MSIE ([0-9]\.[0-9])/i', $_SERVER['HTTP_USER_AGENT'], $matches)){
        $version = floatval($matches[1]);

        if ($version < 6) $encoding = 'none';
        if ($version == 6 && !strstr($_SERVER['HTTP_USER_AGENT'], 'EV1'))    $encoding = 'none';
    }


    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) &&         stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) == '"' . $hash . '"'){
        // Return visit and no modifications, so do not send anything
        header ("HTTP/1.0 304 Not Modified");
        header ('Content-Length: 0');
    }
    else{
        // First time visit or files were modified
        if ($cache){
            // Try the cache first to see if the combined files were already generated
            $cachefile = 'cache-' . $hash . '.' . $type . ($encoding != 'none' ? '.' . $encoding : '');

            if (file_exists($cachedir . '/' . $cachefile)) {
                if ($fp = fopen($cachedir . '/' . $cachefile, 'rb')) {

                    if ($encoding != 'none') header ("Content-Encoding: " . $encoding);
                    header ("Content-Type: text/" . $type);
                    header ("Content-Length: " . filesize($cachedir . '/' . $cachefile));
                    fpassthru($fp);
                    fclose($fp);
                    exit;
                }
            }
        }
        // Get contents of the files
        $contents = '';
		foreach($elements as $element){
            $path = realpath($base . '/' . $element);
            $contents .= "\n\n" . file_get_contents($path);
		}

		if($type == 'javascript' || $type == 'js'){
			$packer = new JavaScriptPacker($contents);
			$contents = $packer->pack();
		}
		else{
			$css->parse($contents);
			$contents = $css->print->plain();
		}
        // Send Content-Type
        header ("Content-Type: text/" . $type);
        //EXPIRA EN UNA 10 DIAS
        $expiresOffset = 3600 * 24 * 10;
        header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT");
        if (isset($encoding) && $encoding != 'none'){
            // Send compressed contents
            $contents = gzencode($contents, 9, $gzip ? FORCE_GZIP : FORCE_DEFLATE);
            header ("Content-Encoding: " . $encoding);
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        }
        else{
            // Send regular contents
            header ('Content-Length: ' . strlen($contents));
            echo $contents;
        }

        // Store cache
        if ($cache) {
            if ($fp = fopen($cachedir . '/' . $cachefile, 'wb')) {
                fwrite($fp, $contents);
                fclose($fp);
            }
        }
    }
?>